home *** CD-ROM | disk | FTP | other *** search
/ Nebula 2 / Nebula Two.iso / SourceCode / Palettes / KeyDownBrowser / UsingKeyDownBrowser / UsingKeyDownBrowserController.m < prev   
Text File  |  1995-06-12  |  4KB  |  154 lines

  1. //---------------------------------------------------------------------------------------------------------
  2. //
  3. //    UsingKeyDownBrowserController
  4. //
  5. //    Inherits From:        Object
  6. //
  7. //    Declared In:        UsingKeyDownBrowserController.h
  8. //
  9. //
  10. //    Disclaimer
  11. //
  12. //        You may freely copy, distribute and reuse this software and its
  13. //        associated documentation. I disclaim any warranty of any kind, 
  14. //        expressed or implied, as to its fitness for any particular use.
  15. //
  16. //---------------------------------------------------------------------------------------------------------
  17. #import "UsingKeyDownBrowserController.h"
  18. #import "KeyDownBrowser.h"
  19. #import <objc/objc-runtime.h>
  20.  
  21.  
  22. @implementation UsingKeyDownBrowserController
  23.  
  24. //---------------------------------------------------------------------------------------------------------
  25. //    Private Methods
  26. //---------------------------------------------------------------------------------------------------------
  27. - _subclassListFor: (const char*) aClass
  28. {
  29.     id        subclassList = [[List alloc] init];
  30.     Class     currentClass;
  31.         
  32.     if (classes == NULL) classes = objc_getClasses();
  33.  
  34.     state = NXInitHashState(classes);
  35.  
  36.     while ( NXNextHashState(classes, &state, (void **)¤tClass) )
  37.         {
  38.         if (strcmp (object_getClassName (currentClass), aClass) == 0) continue;
  39.         if (strcmp (object_getClassName (currentClass->super_class), aClass) == 0)
  40.             [subclassList addObject: (id)object_getClassName(currentClass)];
  41.         }
  42.  
  43.     return subclassList;
  44. }
  45.  
  46.  
  47. - _subclassListForNil
  48. {
  49.     id        subclassList = [[List alloc] init];
  50.     Class     currentClass;
  51.         
  52.     if (classes == NULL) classes = objc_getClasses();
  53.  
  54.     state = NXInitHashState(classes);
  55.  
  56.     while ( NXNextHashState(classes, &state, (void **)¤tClass) )
  57.         if (currentClass->super_class == NULL) 
  58.             [subclassList addObject: (id)object_getClassName(currentClass)];
  59.  
  60.     return subclassList;
  61. }
  62.  
  63.  
  64. - (BOOL) _isLeaf: (const char*) aClass
  65. {
  66.     id        subclassList = [self _subclassListFor: aClass];
  67.     BOOL    isLeaf;
  68.         
  69.     isLeaf = ([subclassList count] ? NO : YES);
  70.     
  71.     if (subclassList) [subclassList free];
  72.     return isLeaf;
  73. }
  74.  
  75.  
  76. static int _Comparator (const void *arg1, const void *arg2)
  77. {
  78.        return NXOrderStrings (*(char**)arg1, *(char**)arg2, YES, -1, NULL);
  79. }
  80.  
  81.  
  82. - _sort: (List*) aList
  83. {
  84.     void*    dataPtr = NX_ADDRESS (aList);
  85.     qsort (dataPtr, [aList count], sizeof (char*), _Comparator);
  86.     return self;
  87. }
  88.  
  89.  
  90. //---------------------------------------------------------------------------------------------------------
  91. //    Action Methods
  92. //---------------------------------------------------------------------------------------------------------
  93. - singleAction:sender
  94. {
  95.     char        path [256];
  96.     int        selectedColumn = [browser selectedColumn];
  97.  
  98.     [doubleActionTextField setStringValue: ""];
  99.     if (selectedColumn == -1) 
  100.         {
  101.         [singleActionTextField setStringValue: ""];
  102.         return self;
  103.         }
  104.     [browser getPath:path toColumn: selectedColumn + 1];
  105.     [singleActionTextField setStringValue: path];
  106.     return self;
  107. }
  108.  
  109.  
  110. - doubleAction:sender
  111. {
  112.     [doubleActionTextField setStringValue: "Double Action"];
  113.     return self;
  114. }
  115.  
  116.  
  117. //---------------------------------------------------------------------------------------------------------
  118. //    Application Delegate Methods
  119. //---------------------------------------------------------------------------------------------------------
  120. - appDidInit: sender
  121. {
  122.     [browser setDoubleAction: @selector (doubleAction:)];
  123.     return self;
  124. }
  125.  
  126.  
  127. //---------------------------------------------------------------------------------------------------------
  128. //    Browser Delegate Method
  129. //---------------------------------------------------------------------------------------------------------
  130. - (int) browser:aBrowser fillMatrix:aMatrix inColumn:(int)aColumn
  131. {
  132.     id    subclassList;
  133.     int    iterator;
  134.     
  135.     if (aColumn == 0)
  136.         subclassList = [self _subclassListForNil];
  137.     else
  138.         subclassList = [self _subclassListFor: [[browser selectedCell] stringValue]];
  139.  
  140.     [self _sort: subclassList];
  141.  
  142.     for (iterator = 0; iterator < [subclassList count]; iterator++)
  143.         {
  144.         [aMatrix renewRows: (iterator + 1) cols:1];
  145.         [[aMatrix cellAt: iterator :0] setStringValue: (char*)[subclassList objectAt: iterator]];
  146.         [[aMatrix cellAt: iterator :0] setLeaf: [self _isLeaf: (char*)[subclassList objectAt: iterator]]];
  147.         }
  148.         
  149.     if (subclassList) [subclassList free];
  150.     return iterator;
  151. }
  152.     
  153.     
  154. @end